package com.hyt.it.ogt.kq.service.gov.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hyt.it.ogt.kq.common.config.exception.KqException;
import com.hyt.it.ogt.kq.service.gov.model.dto.arrange.CandidateSubjectDTO;
import com.hyt.it.ogt.kq.service.gov.model.entity.Task;
import com.hyt.it.ogt.kq.service.gov.model.vo.ArrangeCountVo;
import com.hyt.it.ogt.kq.service.gov.model.vo.CandidateArrangePreVO;
import com.hyt.it.ogt.kq.service.gov.model.vo.arrange.ArrangeCount;
import com.hyt.it.ogt.kq.service.model.entity.CandidateSubject;
import com.hyt.it.ogt.kq.service.model.entity.Subject;
import com.hyt.it.ogt.kq.service.model.param.PushCandidateSubjectParam;

/**
 * <p>
 * 考生科目中间表 服务类
 * </p>
 *
 * @author huangyh
 * @since 2021-04-07
 */
public interface ICandidateSubjectService extends IService<CandidateSubject> {

    /**
     * 根据考生id删除考生科目数据
     * @param taskId 考试任务id
     * @param candidateIdList 考生id的List
     * @return 删除成功条数
     */
    void deleteCandidateSubjects(String taskId, List<String> candidateIdList);

    /**
     * 查询未编排的考生科目数据统计
     * @param taskId
     * @return
     */
    int selectNoTimeRoomCandidateCount(String taskId);

    /**
     * 根据考生ID获取考生科目名称列表
     * @param candidateId
     * @return
     */
    List<String> getCandidateSubjectNames(String candidateId);

    /**
     * 根据导入考生数据中的科目id查询科目
     * @param subjectCodes
     * @param taskId
     * @return
     */
    List<Subject> existBySubjects(Set<String> subjectCodes, String taskId);

    /**
     * 通过考试任务id获取考生科目数据
     * @param taskId 考试任务id
     * @return 考生科目数据
     */
    List<CandidateSubject> listByTaskId(String taskId);

    /**
     * 批量插入科目
     * @param candidateSubjects
     * @return
     */
    boolean insertSubjects(List<CandidateSubject> candidateSubjects);

    /**
     * 获取当前任务重需要编排的考生
     * @param taskId
     * @return
     */
    Map<String, CandidateArrangePreVO> getCandidateNeedArrange(String taskId);

    /**
     * 删除考生科目
     * @param param
     * @param subjectId
     */
    void deleteByPushCandidateSubjectParam(PushCandidateSubjectParam param, String subjectId);


    /**
     * 新增考生科目
     * @param param
     * @param subject
     */
    void insertByPushCandidateSubjectParam(PushCandidateSubjectParam param, Subject subject);

    /**
     * 科目数据校验-并且更新和补全科目code和考生身份证号
     * @param taskId
     * @throws KqException
     */
    void checkCandidateSubjectUpdateSubjectCodeOrIdNumber(String taskId) throws KqException;

    /**
     * 科目数据校验-并且更新和补全科目code和考生身份证号
     * @param task
     * @throws KqException
     */
    void checkCandidateSubjectUpdateSubjectCodeOrIdNumber(Task task) throws KqException;

    /**
     * 获取考生科目数据
     * @param taskId 考试任务id
     * @return 考生科目数据
     */
    List<CandidateSubjectDTO> getCandidateSubjectDTO(String taskId);

    /**
     * 获取未编排的考生科目数据
     * @param taskId
     * @return
     */
    List<CandidateSubjectDTO> getNoArrangeCandidateByOnLine(String taskId);

    /**
     * 考试任务下是否存在指定id的考生科目
     * @param taskId 考试任务id
     * @param candidateId 考生id
     * @param subjectId 科目id
     * @return true：存在，false：不存在
     */
    boolean hasCandidateSubject(String taskId, String candidateId, String subjectId);

    /**
     * 根据考试任务id、批次id、考场id获取考生科目
     * @param taskId 考试任务id
     * @param candidateId 考生id
     * @param subjectId 科目id
     * @return 考生科目
     */
    CandidateSubject one(String taskId, String candidateId, String subjectId);

    /**
     * 考试任务下是否存在指定科目id的考生科目
     * @param taskId 考试任务id
     * @param subjectId 科目id
     * @return true：存在，false：不存在
     */
    boolean hasCandidateSubject(String taskId, String subjectId);

    /**
     * 通过考生id查询考务下考生科目一些字段：subjectId answerType candidateId subjectName
     *
     * @param candidateIds 考生id
     * @param taskId 考务id
     * @return 考生科目
     */
    List<CandidateSubjectDTO> getByCandidateIdsAndTaskId(List<String> candidateIds, String taskId);

    List<ArrangeCount> getSubjectCandidateCount(String taskId);

    List<ArrangeCountVo> getCountBySubject(String taskId);
}
